package com.icoolkj.learn.juc.base.twophasetermination;

import com.icoolkj.learn.juc.base.utils.SleepTools;
import lombok.extern.slf4j.Slf4j;

/**
 * @author icoolkj
 * @version 1.0
 * @description
 * @createDate 2025/03/05 13:16
 */
@Slf4j
public class MonitorThread2 extends Thread {

    // 在监控线程中添加一个 volatile 类型的标识变量，用于标识是否需要终止线程执行
    private volatile boolean terminated = false;

    public void run(){
        while(!Thread.interrupted() && !terminated){
            // 执行监控操作
            log.info("监控线路正在执行监控操作...");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                log.info("监控线程被中断，准备退出...");
                Thread.currentThread().interrupt();
                e.printStackTrace();
            }

        }
        // 执行清理操作
        log.info("监控线程正在执行清理操作...");
        releaseResources();
    }

    public void terminate(){
        // 设置标识变量为 true，并等待一段时间
        terminated = true;
        SleepTools.second(5);
    }

    private void releaseResources() {
        // 是否资源和进行必要的清理工作
        log.info("监控线程正在释放资源和进行必要的清理工作...");
        SleepTools.second(5);
    }

    public static void main(String[] args) {
        MonitorThread2  mt = new MonitorThread2();
        // 启动监控线程
        mt.start();
        // 主线程休眠期间，监控线程在执行监控操作
        SleepTools.second(6);
        //为监控线程设置中断标记位
        mt.interrupt();

        //终止监控线程
        //mt.terminate();

        SleepTools.second(10);
    }


}
